package old;

import old.interfaces.ZarzadcaMenu;
import old.interfaces.ZarzadcaPola;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import javax.microedition.midlet.MIDlet;

public class Ekran extends Canvas implements ZarzadcaMenu, ZarzadcaPola
{ 
    public static final int LEWY_PRZYCISK = -6;
    public static final int PRAWY_PRZYCISK = -7;
    
    public static final int ODRYSUJ_POLE        = 1;
    public static final int ODRYSUJ_NAGLOWEK    = 2;
    public static final int ODRYSUJ_PASEK_MENU  = 4;
    public static final int ODRYSUJ_WSZYSTKO    = 7;
    private int coOdrysowac = ODRYSUJ_WSZYSTKO;
    
    private static final int WIDOK_POLA = 1;
    private static final int WIDOK_LEWEGO_MENU = 2;
    private static final int WIDOK_PRAWEGO_MENU = 4;
    private int coWidac = WIDOK_POLA;
    
    protected Menu menuL;
    protected Menu menuP;
    
    protected MIDlet midlet;
    
    protected Odbiorca odbiorca;
    
    protected int szerokoscEkranu;
    protected int wysokoscEkranu;    
    protected int wysokoscNaglowka;
    protected int wysokoscPaskaMenu;
    protected int wysokoscPola;
    protected int szerokoscPola;
    
    protected boolean klawiszPowtorzony = false;
    
    public String naglowek = "";
    
    public Font czcionka = Font.getDefaultFont();
    public Font czcionkaNaglowka = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE);
    public Font czcionkaMenu = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
    
    public int kolorTla = 0xffffff;
    public int kolorNaglowka = 0x0;
    
    protected Pole pole;
    
    public Ekran(MIDlet m)
    {
        setFullScreenMode(true);
        midlet = m;
        init();
    }
    
    protected void init()
    {
        szerokoscEkranu = getWidth();
        wysokoscEkranu = getHeight();
        wysokoscNaglowka = czcionkaNaglowka.getHeight() + 2;
        wysokoscPaskaMenu = czcionkaMenu.getHeight() + 1;
        wysokoscPola = wysokoscEkranu - wysokoscNaglowka - wysokoscPaskaMenu;
        szerokoscPola = szerokoscEkranu;
    }
    
    public void ustawPole(Pole p, String n)
    {
        pole = p;
        naglowek = n;
        pole.przygotuj(this, szerokoscPola, wysokoscPola);
        coOdrysowac = ODRYSUJ_POLE | ODRYSUJ_NAGLOWEK;
        repaint();
    }
    
    public void ustawNaglowek(String n)
    {
        naglowek = n;
        coOdrysowac = ODRYSUJ_NAGLOWEK;
        repaint();
    }

    public void ustawOdbiorce(Odbiorca o)
    {
        odbiorca = o;
    }
    
    public void ustawMenu(Menu m, int p)
    {
        switch(p)
        {
            case LEWY_PRZYCISK:
                menuL = m;
                menuL.przygotuj(this, szerokoscEkranu, wysokoscEkranu / 2);
                break;
            case PRAWY_PRZYCISK:
                menuP = m;
                menuP.przygotuj(this, szerokoscEkranu, wysokoscEkranu / 2);
                break;
            default:
                throw new IllegalArgumentException("Nieprawidłowa stała przycisku.");
        }
    }

    protected final void keyPressed(int kod)
    {
        switch(kod)
        {
            case LEWY_PRZYCISK:
                switch(coWidac)
                {
                    case WIDOK_POLA:
                        if(menuL != null)
                        {
                            coWidac = WIDOK_LEWEGO_MENU;
                            coOdrysowac = ODRYSUJ_POLE;
                            repaint();
                        }
                        break;
                    case WIDOK_PRAWEGO_MENU:
                        coWidac = WIDOK_POLA;
                        coOdrysowac = ODRYSUJ_WSZYSTKO;
                        repaint();
                        break;
                    case WIDOK_LEWEGO_MENU:
                        menuL.obslugaKlawiszy(-5);
                        break;
                }
                break;
            case PRAWY_PRZYCISK:
                switch(coWidac)
                {
                    case WIDOK_POLA:
                        if(menuP != null)
                        {
                            coWidac = WIDOK_PRAWEGO_MENU;
                            coOdrysowac = ODRYSUJ_POLE;
                            repaint();
                        }
                        break;
                    case WIDOK_PRAWEGO_MENU:
                        menuP.obslugaKlawiszy(-5);
                        break;
                    case WIDOK_LEWEGO_MENU:
                        coWidac = WIDOK_POLA;
                        coOdrysowac = ODRYSUJ_WSZYSTKO;
                        repaint();
                        break;
                }
                break;
            default:
                switch(coWidac)
                {
                    case WIDOK_POLA:
                        if(pole != null)
                            pole.obslugaKlawiszy(kod);
                        break;
                    case WIDOK_LEWEGO_MENU:
                        menuL.obslugaKlawiszy(kod);
                        break;
                    case WIDOK_PRAWEGO_MENU:
                        menuP.obslugaKlawiszy(kod);
                        break;
                }
                break;
        }
    }

    protected final void keyRepeated(int kod)
    {
        klawiszPowtorzony = true;
        keyPressed(kod);
        klawiszPowtorzony = false;
    }

    protected void paint(Graphics g)
    {
        if((coOdrysowac & ODRYSUJ_NAGLOWEK) == ODRYSUJ_NAGLOWEK)
        {
            g.setColor(kolorTla);
            g.fillRect(0, 0, szerokoscEkranu, wysokoscNaglowka);
            g.setColor(kolorNaglowka);
            g.setFont(czcionkaNaglowka);
            g.drawString(naglowek, szerokoscEkranu / 2, 2, Graphics.HCENTER | Graphics.TOP);
        }
        
        if((coOdrysowac & ODRYSUJ_POLE) == ODRYSUJ_POLE)
        {
            switch(coWidac)
            {
                case WIDOK_POLA:
                    g.translate(0, wysokoscNaglowka);
                    pole.rysuj(g, szerokoscPola, wysokoscPola);
                    break;
                case WIDOK_LEWEGO_MENU:
                    g.translate(0, wysokoscEkranu - menuL.wysokoscMenu - wysokoscPaskaMenu);
                    menuL.rysuj(g);
                    break;
                case WIDOK_PRAWEGO_MENU:
                    g.translate(szerokoscEkranu - menuP.szerokoscMenu, wysokoscEkranu - menuP.wysokoscMenu - wysokoscPaskaMenu);
                    menuP.rysuj(g);
                    break;
            }
        }
    }
    
    public void odrysujPole()
    {
        if(pole != null)
        {
            coOdrysowac = ODRYSUJ_POLE;
            repaint();
        }
    }
    
    public int wysokoscPola()
    {
        return wysokoscPola;
    }
    
    public int kolorTla()
    {
        return kolorTla;
    }
    
    public void odrysujMenu(Menu menu)
    {
        coOdrysowac = ODRYSUJ_POLE;
        repaint();
    }

    public void ukryjMenu(Menu menu)
    {
        coWidac = WIDOK_POLA;
        coOdrysowac = ODRYSUJ_WSZYSTKO;
        repaint();
    }
    
    public static interface Odbiorca
    {
        void zdarzenieEkranu(Ekran nadawca, int kod);
    }
}
